package utils

import (
	"fmt"
	"os"

	"gopkg.in/ini.v1"
	"nodemessage.com/ruov-cli/config"
	"nodemessage.com/ruov-cli/consts"
)

// LoadInstall 从配置文件加载安装相关配置到结构体
func LoadInstall() (*config.Install, error) {
	if _, err := os.Stat(consts.InstallFile); os.IsNotExist(err) {
		return nil, fmt.Errorf("安装配置文件不存在: %v", err)
	}

	cfg, err := ini.Load(consts.InstallFile)
	if err != nil {
		return nil, fmt.Errorf("读取安装配置文件失败: %v", err)
	}

	// 映射到结构体
	var install config.Install
	err = cfg.MapTo(&install)
	if err != nil {
		return nil, fmt.Errorf("映射安装配置到结构体失败: %v", err)
	}

	return &install, nil
}

// SaveInstall 保存安装配置到文件
func SaveInstall(install *config.Install) error {
	cfg := ini.Empty()
	err := ini.ReflectFrom(cfg, install)
	if err != nil {
		return fmt.Errorf("从结构体反射到配置失败: %v", err)
	}

	// 确保目录存在
	dir := consts.ConfPath
	if _, err := os.Stat(dir); os.IsNotExist(err) {
		err = os.MkdirAll(dir, os.ModePerm)
		if err != nil {
			return fmt.Errorf("创建配置目录失败: %v", err)
		}
	}

	// 保存到文件
	if err := cfg.SaveTo(consts.InstallFile); err != nil {
		return fmt.Errorf("保存安装配置文件失败: %v", err)
	}

	return nil
}

// InitDefaultInstall 初始化默认安装配置
func InitDefaultInstall() error {
	// 检查配置文件是否存在
	if _, err := os.Stat(consts.InstallFile); err == nil {
		// 文件已存在，不需要初始化
		return nil
	}

	// 创建默认配置
	install := &config.Install{}

	// 设置默认值
	// Nginx配置
	install.Nginx.SetupRootPath = "opt/nginx"
	install.Nginx.RootPath = "/usr/local/nginx"

	// Mysql配置
	install.Mysql.RootPath = "/usr/local/mysql"
	install.Mysql.Port = 3306
	install.Mysql.RootDefaultPwd = "123"

	// Redis配置
	install.Redis.RootPath = "/usr/local/redis"
	install.Redis.Port = 6379
	install.Redis.DefaultPwd = ""

	// NVM配置
	install.Nvm.RootPath = "/usr/local/nvm"

	// Pyenv配置
	install.Pyenv.RootPath = "/usr/local/pyenv"

	// JDK配置
	install.Jdk.PackagePath = "/usr/local/jdk"

	// 保存配置
	return SaveInstall(install)
}
